#include "comm.hpp"

//程序加载的时候会创建对象，然后创建管道文件
//程序退出的时候，析构函数会删除管道文件
Init init;
string TransToHex(key_t k)
{
    char buffer[32];
    snprintf(buffer, sizeof buffer, "0x%x", k);
    return buffer;
}
int main()
{
    // 1.创建公共的key值
    key_t k = ftok(PATH_NAME, PROJ_ID);
    assert(k != -1);
    Log("creat key done", Debuge) << " server key : " << TransToHex(k) << endl;

    // 2.创建公共的共享内存（全新的）---通信的发起者
    int shmid = shmget(k, SHM_SIZE, IPC_CREAT | IPC_EXCL | 0666); // 加上权限
    if (shmid == -1)
    {
        perror("server:shmget");
        exit(1);
    }
    Log("creat shm done", Debuge) << " shmid : " << shmid << endl;
    // 3.将指定的共享内存挂接到自己的进程空间中
    char *shmaddr = (char *)shmat(shmid, nullptr, 0);
    Log("attach shm done", Debuge) << " shmid : " << shmid << endl;
    //sleep(10);
    //当共享内存当作一个大字符串

    int fd=OpenFIFO(FIFO_NAME,READ);//打开管道文件

    while(true)
    {
        Wait(fd);//等待数据进行读取

        printf("%s\n",shmaddr);   
        if(strcmp(shmaddr,"quit")==0) break;
         sleep(1);
    }


    // 4.将指定的共享内存从自己的进程空间中去关联
    int dt = shmdt(shmaddr);
    assert(dt != -1);
    (void)dt;
    Log("detach shm done", Debuge) << " shmid : " << shmid << endl;
    //sleep(10);

    // 5.删除共享内存
    int n = shmctl(shmid, IPC_RMID, nullptr); //(RMID,即便有进程在挂接共享内存，也会删除)
    assert(n != -1);
    (void)n;
    Log("delete shm done", Debuge) << " shmid : " << shmid << endl;
    CloseFIFO(fd);//关闭管道文件
    return 0;
}